package cn.com.dcsgo.validation.validator;

import cn.com.dcsgo.validation.ValueOf;
import jakarta.validation.ConstraintValidator;
import jakarta.validation.ConstraintValidatorContext;

import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;

/**
 * ValueOf校验器
 * 支持校验Integer、Long、String等常见数据类型的值是否在给定集合中
 *
 * @author Dcsgo
 * @since 2025/10/12 15:46
 */
public class ValueOfValidator implements ConstraintValidator<ValueOf, Object> {
    private Set<String> allowedValues;

    @Override
    public void initialize(ValueOf constraintAnnotation) {
        // 将注解中的值转换为String并收集到Set中，用于后续比较
        allowedValues = Arrays.stream(constraintAnnotation.value())
                .map(Object::toString)
                .collect(Collectors.toSet());
    }

    @Override
    public boolean isValid(Object value, ConstraintValidatorContext constraintValidatorContext) {
        // 如果值为null，校验通过（如需非null校验，请使用@NotNull注解）
        if (value == null) {
            return true;
        }
        
        // 将值转换为字符串并检查是否在允许的值集合中
        // 这样可以支持Integer、Long、String等多种数据类型
        return allowedValues.contains(value.toString());
    }
}